6
תגובות
חשבתי שאפשר להשתמש ב-Logical Operators רק בתנאי if וכדו', אבל אז נתקלתי שוב בקוד שמכיל:
... or exit()

ואז נכנסתי לדוקומנטציה וראיתי:
// foo() will never get called as those operators are short-circuit

$a = (false && foo());
$b = (true  || foo());
$c = (false and foo());
$d = (true  or  foo());


<?php
     true && false || false
?>
returns false, but

<?php
     true AND false || false
?>
returns true.


ולא הבנתי.

6 תשובות

avatar ענה cthulhu ב 11 ליולי 2012 #

ל-and ו-&& בדיוק כמו ל-or ו-|| יש סדר שונה שבו הם מעובדים. בדוגמא הראשונה ייצא false כי && קודם ל-|| (ב-php) לכן יחושב: true && false שיחזיר false כמובן, ואז false || false שגם כן יחזיר false.

בדוגמא השנייה יש ערבוב של AND ו-||.
|| קודם ל-and/or, לכן הוא יבוצע ראשון - false || false ייתן false. לאחר מכן true AND false שבמקרה זה רק true נשאר ומתעלמים מ-false.

ה"סדר" הוא כמו סדר פעולות חשבון. רק שכאן מדובר בפעולות לוגיות ולא אריתמטיות.

avatar ענה OrelBeY ב 11 ליולי 2012 #

כן, קראתי על הסדר של האופרטורים... מה שאני עדיין לא מבין זה את זה:

$a = (false && foo());
$b = (true  || foo());
$c = (false and foo());
$d = (true  or  foo());

ו:
... or exit();

מה הדברים האלה אמורים לעשות? ואיך?

avatar ענה cthulhu ב 11 ליולי 2012 #

אם באמת היית קורא, לא היית שואל את זה.

בגלל שב-php מיושם העקרון של "McCarthy evaluation", הארגומנט השני, שבמקרה הזה זה הפונקציה foo, לא יקרא עד שהארגומנט הראשון ייתן תוצאה מסוימת שלא תתאים.
במקרה של a: פה הארגומנט הראשון הוא false, ואחריו בה האופרטור "וגם", כלומר זה לא משנה מה הערך ש-foo מחזיר, כי ברגע שאחד הארגומנטים הינו false, הפעולה הלוגית "וגם" תחזיר שקר. לכן foo לא מופעל במקרה הזה, כי במילא התוצאה לא תשתנה.
במקרה של b: אותו דבר, רק שמדובר כאן בפעולה לוגית "או". ברגע שאחד הארגומנטים הוא true, "או" תמיד יחזיר אמת, ולכן אין צורך להפעיל את foo, כי התוצאה לא תשתנה.
במקרה של c: תחילה c מקבל את הערך של הארגומנט הראשון שהוא false, ואז לא מתייחסים לארגומנט שני, כלומר אין קריאה לפונקציה foo (כי יש כאן פעולה לוגית "וגם").
במקרה של d: גם כן, d מקבל את הערך true, ואז לא מתייחסים לארגומנט שני שהוא foo (כי יש כאן פעולה לוגית "או").

וה-"or exit" - אותו דבר: הארגומנט הראשון (השמאלי ביותר) - אם הוא מחזיר תוצאה שלילית, רק אז exit ייקרא. בכל מקרה, המשתנה תמיד יכיל את הערך של הארגומנט הראשון.

avatar ענה OrelBeY ב 11 ליולי 2012 #

באמת קראתי. :)
לא ידעתי על העיקרון הזה. יש במקרה עוד כמה עקרונות שאני עלול לא לדעת? יש בדוקומנטציה משהו על עקרונות כאלה או משהו בסגנון?
ואגב, מה היה קורה אם היה:

$a = (false || foo());

או אם היה:
$b = (true && foo());

?
הפוקנציה הייתה מופעלת? ומה עם המשתנים a ו-b? מה יקרה איתם?

avatar ענה cthulhu ב 11 ליולי 2012 #

אין דף מרכז אחד. כל מקרה לגופו.

לגבי ה-a בדוגמא שלך: כן, הפונקציה foo תיקרא, מכיוון ש-false בארגומנט ראשון לא בהכרח אומר שהפעולה הלוגית "או" תחזיר שקר. יכול להיות שארגומנט שני יהיה true, וכל הביטוי יהיה אמת במקרה כזה. לכן הפונקציה כן תופעל.

לגבי ה-b בדוגמא שלך: כן, גם במקרה זה היא תופעל, כי ארגומנט אחד שהוא true בפעולה לוגית "וגם" לא מעיד על התוצאה של הפעולה הלוגית הזאת. אם foo יחזיר false, אז התוצאה תיהיה שקר. לכן foo יופעל כאן. אם במקום true היה כאן false, אז היא לא הייתה מופעלת, שכן אם ארגומנט אחד בפעולה לוגית "וגם" הינו שקר, אז הפעולה הלוגית הזאת תמיד תחזיר שקר, ולא משנה איזה ערך יחזיר הארגומנט השני.

בשני המקרים, המשתנים יכילו את התוצאה של הפעולה הלוגית.

avatar ענה OrelBeY ב 11 ליולי 2012 #

אוקיי. שוב תודה. :)